Przykad 6.6. Algorytm Bellmana-Forda znajdowania najkrtszych cieek z jednego rda
#include "Graph.h"
/**
 * W skierowanym grafie z wagami oblicz najkrtsz odlego (dist) do
 * wszystkich wierzchokw grafu i dla wszystkich wierzchokw zapisz
 * dowizania do poprzednikw (pred), aby mona byo odtworzy te cieki.
 * Wagi grafu mog by ujemne, o ile nie ma ujemnych cykli.
 */
void singleSourceShortest (Graph const &graph, int s,               /* we */
                           vector<int> &dist, vector<int> &pred) {  /* wy */
   // Zainicjuj tablice dist[] i pred[]
   const int n = graph.numVertices();
   pred.assign(n, -1);
   dist.assign(n, numeric_limits<int>::max());
   dist[s] = 0;

   // Po n-1 krokach moemy by pewni poprawnego obliczenia najkrtszych
   // odlegoci z s do wszystkich wierzchokw. Tote w n-tym kroku
   // zmiana ktrejkolwiek wartoci powoduje cykl ujemny.
   // Wyjd zawczasu, jeli nie wykonano adnych zmian.
   for (int i = 1; i <= n; i++) {
      bool failOnUpdate = (i == n);
      bool leaveEarly = true;

      // Przetwrz kady wierzchoek u i odpowiadajce mu krawdzie,
      // aby sprawdzi, czy ktra krawd (u,v) nie daje krtszej
      // odlegoci z s->v przy przechodzeniu przez s->u->v. Uywaj
      // liczb typu long, aby zapobiec nadmiarowi.
      for (int u = 0; u < n; u++) {
         for (VertexList::const_iterator ci = graph.begin(u);
              ci != graph.end(u); ++ci) {
            int v = ci->first;
            long newLen = dist[u];
            newLen += ci->second;
            if (newLen < dist[v]) {
               if (failOnUpdate) { throw "Graf ma cykl ujemny"; }
               dist[v] = newLen;
               pred[v] = u;
               leaveEarly = false;
            }
         }
      }
      if (leaveEarly) { break; }
   }
}
